package arvBinariaInteiros;


import static org.junit.Assert.*;
import junit.framework.Assert;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;


public class TestArvoreBinariaInteiros {

	private ArvoreBinariaInteiros raiz;
	
	@Before
	public void setUp() throws Exception {
		raiz = new ArvoreBinariaInteirosImpl();
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void testIsEmpty() {
		Assert.assertEquals(true, raiz.isEmpty());
	}

	@Test
	public void testIsLeaf() {
		Assert.assertEquals(false, raiz.isLeaf());
		raiz.inserir(8);
		Assert.assertEquals(true, raiz.isLeaf());
	}

	@Test
	public void testAltura() {
		Assert.assertEquals(-1, raiz.altura());
		raiz.inserir(8);
		Assert.assertEquals(0, raiz.altura());
		raiz.inserir(4);
		Assert.assertEquals(1, raiz.altura());
		raiz.inserir(12);
		Assert.assertEquals(1, raiz.altura());
		raiz.inserir(2);
		Assert.assertEquals(2, raiz.altura());
		raiz.inserir(6);
		Assert.assertEquals(2, raiz.altura());
		raiz.inserir(5);
		Assert.assertEquals(3, raiz.altura());
		raiz.inserir(15);
		Assert.assertEquals(3, raiz.altura());
		raiz.inserir(17);
		Assert.assertEquals(3, raiz.altura());
		raiz.inserir(16);
		Assert.assertEquals(4, raiz.altura());
	}

	@Test
	public void testPesquisar() {
		raiz.inserir(8);
		raiz.inserir(4);
		raiz.inserir(12);
		raiz.inserir(2);
		raiz.inserir(6);
		raiz.inserir(5);
		raiz.inserir(15);
		raiz.inserir(17);
		raiz.inserir(14);
		Assert.assertEquals(true, raiz.pesquisar(4));
		Assert.assertEquals(true, raiz.pesquisar(15));
		Assert.assertEquals(true, raiz.pesquisar(2));
		Assert.assertEquals(true, raiz.pesquisar(17));
		Assert.assertEquals(false, raiz.pesquisar(19));
	}

	@Test
	public void testInserir() {
		Assert.assertEquals(0, raiz.countElements());
		raiz.inserir(8);
		Assert.assertEquals(1, raiz.countElements());
		raiz.inserir(4);
		Assert.assertEquals(2, raiz.countElements());
		raiz.inserir(12);
		Assert.assertEquals(3, raiz.countElements());
		raiz.inserir(2);
		Assert.assertEquals(4, raiz.countElements());
		raiz.inserir(6);
		Assert.assertEquals(5, raiz.countElements());
		raiz.inserir(5);
		Assert.assertEquals(6, raiz.countElements());
		raiz.inserir(15);
		Assert.assertEquals(7, raiz.countElements());
		raiz.inserir(17);
		Assert.assertEquals(8, raiz.countElements());
		raiz.inserir(14);
		Assert.assertEquals(9, raiz.countElements());
	}

	@Test
	public void testMaximo() {
		raiz.inserir(8);
		Assert.assertEquals(8, raiz.maximo());
		raiz.inserir(4);
		Assert.assertEquals(8, raiz.maximo());
		raiz.inserir(12);
		Assert.assertEquals(12, raiz.maximo());
		raiz.inserir(2);
		Assert.assertEquals(12, raiz.maximo());
		raiz.inserir(6);
		Assert.assertEquals(12, raiz.maximo());
		raiz.inserir(5);
		Assert.assertEquals(12, raiz.maximo());
		raiz.inserir(15);
		Assert.assertEquals(15, raiz.maximo());
		raiz.inserir(17);
		Assert.assertEquals(17, raiz.maximo());
		raiz.inserir(14);
		Assert.assertEquals(17, raiz.maximo());
	}

	@Test
	public void testMinimo() {
		raiz.inserir(8);
		Assert.assertEquals(8, raiz.minimo());
		raiz.inserir(4);
		Assert.assertEquals(4, raiz.minimo());
		raiz.inserir(12);
		Assert.assertEquals(4, raiz.minimo());
		raiz.inserir(2);
		Assert.assertEquals(2, raiz.minimo());
		raiz.inserir(6);
		Assert.assertEquals(2, raiz.minimo());
		raiz.inserir(5);
		Assert.assertEquals(2, raiz.minimo());
		raiz.inserir(15);
		Assert.assertEquals(2, raiz.minimo());
		raiz.inserir(17);
		Assert.assertEquals(2, raiz.minimo());
		raiz.inserir(14);
		Assert.assertEquals(2, raiz.minimo());
	}

	@Test
	public void testRemover() {
		raiz.inserir(8);
		raiz.inserir(4);
		raiz.inserir(12);
		raiz.inserir(2);
		raiz.inserir(6);
		raiz.inserir(5);
		raiz.inserir(15);
		raiz.inserir(17);
		raiz.inserir(16);
		Assert.assertEquals(9, raiz.countElements());
		Assert.assertEquals(17, raiz.maximo());
		raiz.remover(17);
		Assert.assertEquals(8, raiz.countElements());
		Assert.assertEquals(16, raiz.maximo());
		raiz.remover(16);
		Assert.assertEquals(7, raiz.countElements());
		Assert.assertEquals(15, raiz.maximo());
		raiz.remover(15);
		Assert.assertEquals(6, raiz.countElements());
		Assert.assertEquals(12, raiz.maximo());
	}

	@Test
	public void testPreOrdem() {
		raiz.inserir(8);
		raiz.inserir(4);
		raiz.inserir(12);
		raiz.inserir(2);
		raiz.inserir(6);
		raiz.inserir(5);
		raiz.inserir(15);
		raiz.inserir(17);
		raiz.inserir(14);
		raiz.preOrdem();
		System.out.println("");
	}

	@Test
	public void testOrdem() {
		raiz.inserir(8);
		raiz.inserir(4);
		raiz.inserir(12);
		raiz.inserir(2);
		raiz.inserir(6);
		raiz.inserir(5);
		raiz.inserir(15);
		raiz.inserir(17);
		raiz.inserir(14);
		raiz.ordem();
		System.out.println("");
	}

	@Test
	public void testPosOrdem() {
		raiz.inserir(8);
		raiz.inserir(4);
		raiz.inserir(12);
		raiz.inserir(2);
		raiz.inserir(6);
		raiz.inserir(5);
		raiz.inserir(15);
		raiz.inserir(17);
		raiz.inserir(14);
		raiz.posOrdem();
		System.out.println("");
	}
	@Test
	public void testCountElements() {
		Assert.assertEquals(0, raiz.countElements());
		raiz.inserir(8);
		Assert.assertEquals(1, raiz.countElements());
		raiz.inserir(4);
		Assert.assertEquals(2, raiz.countElements());
		raiz.inserir(12);
		Assert.assertEquals(3, raiz.countElements());
		raiz.inserir(2);
		Assert.assertEquals(4, raiz.countElements());
		raiz.inserir(6);
		Assert.assertEquals(5, raiz.countElements());
		raiz.inserir(5);
		Assert.assertEquals(6, raiz.countElements());
		raiz.inserir(15);
		Assert.assertEquals(7, raiz.countElements());
		raiz.inserir(17);
		Assert.assertEquals(8, raiz.countElements());
		raiz.inserir(16);
		Assert.assertEquals(9, raiz.countElements());
	}

}
